package org.dxy.domain.event;

import org.dxy.types.id.HutoolSnowflakeGenerator;

import java.time.LocalDateTime;

/**
 * 领域事件接口
 * @author dxy
 * @createTime 2025/6/13 22:31
 */
public interface DomainEvent {

    
    /**
     * 获取事件ID，唯一标识
     * @return 事件ID
     */
    default Long eventId() {
        return HutoolSnowflakeGenerator.generateId();
    }



    /**
     * 获取聚合根类型
     * @return 聚合根类型
     */
    default String aggregateType() {
        return this.getClass().getSimpleName().replace("Event", "");
    }

    /**
     * 获取事件类型
     * @return 事件类型
     */
    default String eventType() {
        return this.getClass().getSimpleName();
    }



    default String source() {
        return EventSourceEnum.USER.getKey();
    }

    /**
     * 获取发生时间
     * @return 发生时间
     */
    default LocalDateTime occurredAt() {
        return LocalDateTime.now();
    }

    /**
     * 获取聚合根ID（需要具体事件实现）
     * @return 聚合根ID
     */
    Long aggregateId();

    /**
     * 获取事件版本，默认 V1
     */
    default Integer getEventVersion() {
        return 1;
    }

    /**
     * 获取事件顺序（可选，默认为0）
     * @return 事件顺序
     */
    default int index() {
        return 0;
    }
}


